In modern software development, models may be created as a way to define or describe a piece of a solution or a complete solution. These models can then be visualized using a modeling tool. For example, a computer software component diagram may reflect the system architecture and represent the structure of the system including such things as source code. Traditionally, models are static, that is, they represent a point-in-time snapshot of the systems and underlying artifacts that they represent.
Artifacts are physical manifestations of computer software, such as code files, configuration files, entire projects, etc. When these underlying artifacts change, the model must be updated, typically by hand, to reflect those changes. More recently, modeling tools have incorporated some level of automated synchronization with the artifacts that they seek to represent. The level of automation is often limited to the modeling tool performing synchronization activities when the user invokes a command (e.g. presses a button, etc.).
Many modeling tools are also limited in that they can only synchronize with those types of artifacts that are already known at the time the modeling tool is shipped. This awareness is made known by defining the type of artifacts directly in the modeling tool. Many modeling tools do not allow for the definition of new types of artifacts, let alone how to interact with those artifacts to stay synchronized.